
package modelos;

import conexion.CRUD;
import conexion.Conexion;
import global.DatosGlobales;
import interfaces.modelo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class Alumno implements modelo{
    
    public static String TABLA = "alumnos";
    public static String SP = "SP_alumnos";
    
    private Integer matricula = 0;
    public static final String PROP_MATRICULA = "matricula";
    
    private String nombre;
    public static final String PROP_NOMBRE = "nombre";
    
    private String apellidoPaterno;
    public static final String PROP_APELLIDOPATERNO = "apellidoPaterno";
    
    private String apellidoMaterno;
    public static final String PROP_APELLIDOMATERNO = "apellidoMaterno";
    
    private String direccion;
    public static final String PROP_DIRECCION = "direccion";
    
    private String telefono;
    public static final String PROP_TELEFONO = "telefono";
    
    private Carrera idCarrera;
    public static final String PROP_IDCARRERA = "idCarrera";
    
    private List<Materia> materias;
    public static final String PROP_MATERIAS = "materias";

   

    
    private Boolean nuevo = Boolean.TRUE;
    
    
    public Alumno() {
        
    }

    public Alumno(Integer matricula, String nombre, String apellidoPaterno, String apellidoMaterno, String direccion, String telefono) {
        this.matricula = matricula;
        this.nombre = nombre;
        this.apellidoPaterno = apellidoPaterno;
        this.apellidoMaterno = apellidoMaterno;
        this.direccion = direccion;
        this.telefono = telefono;
    }

    public Alumno(Integer matricula, String nombre, String apellidoPaterno, String apellidoMaterno, String direccion, String telefono, Carrera idCarrera) {
        this.matricula = matricula;
        this.nombre = nombre;
        this.apellidoPaterno = apellidoPaterno;
        this.apellidoMaterno = apellidoMaterno;
        this.direccion = direccion;
        this.telefono = telefono;
        this.idCarrera = idCarrera;
    }
    
    


    public Carrera getIdCarrera() {
        return idCarrera;
    }

   
    public void setIdCarrera(Carrera idCarrera) {
        Carrera oldIdCarrera = this.idCarrera;
        this.idCarrera = idCarrera;
        propertyChangeSupport.firePropertyChange(PROP_IDCARRERA, oldIdCarrera, idCarrera);
    }


   
    public String getTelefono() {
        return telefono;
    }


    public void setTelefono(String telefono) {
        String oldTelefono = this.telefono;
        this.telefono = telefono;
        propertyChangeSupport.firePropertyChange(PROP_TELEFONO, oldTelefono, telefono);
    }


    public String getDireccion() {
        return direccion;
    }


    public void setDireccion(String direccion) {
        String oldDireccion = this.direccion;
        this.direccion = direccion;
        propertyChangeSupport.firePropertyChange(PROP_DIRECCION, oldDireccion, direccion);
    }



    public String getApellidoMaterno() {
        return apellidoMaterno;
    }

 
    public void setApellidoMaterno(String apellidoMaterno) {
        String oldApellidoMaterno = this.apellidoMaterno;
        this.apellidoMaterno = apellidoMaterno;
        propertyChangeSupport.firePropertyChange(PROP_APELLIDOMATERNO, oldApellidoMaterno, apellidoMaterno);
    }


 
    public String getApellidoPaterno() {
        return apellidoPaterno;
    }


    public void setApellidoPaterno(String apellidoPaterno) {
        String oldApellidoPaterno = this.apellidoPaterno;
        this.apellidoPaterno = apellidoPaterno;
        propertyChangeSupport.firePropertyChange(PROP_APELLIDOPATERNO, oldApellidoPaterno, apellidoPaterno);
    }



    public String getNombre() {
        return nombre;
    }

  
    public void setNombre(String nombre) {
        String oldNombre = this.nombre;
        this.nombre = nombre;
        propertyChangeSupport.firePropertyChange(PROP_NOMBRE, oldNombre, nombre);
    }


    public Integer getMatricula() {
        return matricula;
    }


    public void setMatricula(Integer matricula) {
        Integer oldMatricula = this.matricula;
        this.matricula = matricula;
        propertyChangeSupport.firePropertyChange(PROP_MATRICULA, oldMatricula, matricula);
    }
    

    public List<Materia> getMaterias() {
        return materias;
    }

   
    public void setMaterias(List<Materia> materias) {
        List<Materia> oldMaterias = this.materias;
        this.materias = materias;
        propertyChangeSupport.firePropertyChange(PROP_MATERIAS, oldMaterias, materias);
    }
    
    private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

 
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

   
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    //CRUD
    
    @Override
    public void guardar() {
        try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Alumno.SP+"(?,?,?,?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        if(getNuevo()){
            prepareCall.setInt(i++, CRUD.Insert.getOpcion());
        }else{
            prepareCall.setInt(i++, CRUD.Update.getOpcion());
        }
        prepareCall.setInt(i++, this.getMatricula());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.getApellidoPaterno());
        prepareCall.setString(i++, this.getApellidoMaterno());
        prepareCall.setString(i++, this.getDireccion());
        prepareCall.setString(i++, this.getTelefono());
        prepareCall.setInt(i++, this.getIdCarrera()!= null? this.getIdCarrera().getIdCarrera():0);
        prepareCall.setInt(i++, DatosGlobales.getInstance().getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }

    @Override
    public void eliminar() {
         try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Alumno.SP+"(?,?,?,?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
       
            prepareCall.setInt(i++, CRUD.Delete.getOpcion());

        prepareCall.setInt(i++, this.getMatricula());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.getApellidoPaterno());
        prepareCall.setString(i++, this.getApellidoMaterno());
        prepareCall.setString(i++, this.getDireccion());
        prepareCall.setString(i++, this.getTelefono());
        prepareCall.setInt(i++, this.getIdCarrera()!= null? this.getIdCarrera().getIdCarrera():0);
        prepareCall.setInt(i++, DatosGlobales.getInstance().getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }
    
    public static List<Alumno> getAlumnos(String where){
        List<Alumno> result = new ArrayList<Alumno>();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Alumno.TABLA);
            while (rs.next()) {
                result.add(Alumno.makeAlumno(rs));
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
     public static List<Alumno> getAlumnosMaterias(String where){
        List<Alumno> result = new ArrayList<Alumno>();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Alumno.TABLA);
            while (rs.next()) {
                Alumno al = Alumno.makeAlumno(rs);
                al.setMaterias(Materia.getMateriasByAlumno(al.getMatricula()));
                result.add(al);
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }

    public static Alumno getAlumnoByMatricula(Integer id){
         Alumno result = new Alumno();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Alumno.TABLA+" where matricula ="+id);
            while (rs.next()) { 
                result = Alumno.makeAlumno(rs);
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    private static Alumno makeAlumno(ResultSet rs) throws SQLException{
        Alumno result = null;
                int i =1;
                Integer matricula = rs.getInt(i++);
                String nombre = rs.getString(i++);
                String apellido1 = rs.getString(i++);
                String apellido2 = rs.getString(i++);
                String direccion = rs.getString(i++);
                String tel = rs.getString(i++);
                Carrera carrera = Carrera.getCarreraById(rs.getInt(i++));
                result = new Alumno(matricula, nombre, apellido1, apellido2, direccion, tel, carrera);
                result.setNuevo(Boolean.FALSE);
            
        return result;
    }
    
    public static void main(String[] args) {
       
        Alumno al = new Alumno(235792, "Luis", "Ramirez", "Martinez", "c 2 pte 912", "4721722",Carrera.getCarreraById(1));
        al.guardar();
        System.out.println(
        Alumno.getAlumnos("").size());
    }

    /**
     * @return the nuevo
     */
    public Boolean getNuevo() {
        return nuevo;
    }

    /**
     * @param nuevo the nuevo to set
     */
    public void setNuevo(Boolean nuevo) {
        this.nuevo = nuevo;
    }
    
    public String toString(){
        return getNombre() + " " + getApellidoPaterno() + " " + getApellidoMaterno(); 
    }
    
    
}
